package com.itcast.googleplay.ui;

import com.itcast.googleplay.R;
import com.itcast.googleplay.utils.UIUtils;

import android.content.Context;
import android.view.View;
import android.widget.FrameLayout;

public abstract class LoadingPage extends FrameLayout {
	//维护4中类型的界面
	public View errorView;
	public View emptyView;
	public View loadingView;
	public View successedView;
	
	//维护界面需匹配的状态
	
	//初始状态码值
	public static final int STATE_NONE = 0;
	//请求网络失败的状态码
	public static final int STATE_ERROR = 1;
	//请求网络成功,但是没有数据的状态码
	public static final int STATE_EMPTY = 2;
	//请求网络过程中,状态吗
	public static final int STATE_LOADING = 3;
	//请求成功状态码
	public static final int STATE_SUCCESSED = 4;
	
	//当前所处状态的变量(static 项目全局变量,仅有一份)
	public int curretState = STATE_NONE;
	
	//LoadingPage只需要new就可以了,所以不需要提供样式(style)和属性(Attrs)
	public LoadingPage(Context context) {
		super(context);
		initView();
	}

	private void initView() {
		//添加错误界面
		if(errorView == null){
			errorView = UIUtils.inflate(R.layout.layout_error_view);
			addView(errorView);
		}
		
		//添加为空界面
		if(emptyView == null){
			emptyView = UIUtils.inflate(R.layout.layout_empty_view);
			addView(emptyView);
		}
		//添加正在加载的view
		if(loadingView == null){
			loadingView = UIUtils.inflate(R.layout.layout_loading_view);
			addView(loadingView);
		}
		//加载成功的view目前先不做处理,在后续处理

		//根据状态判断页面显示隐藏的方法
		showPage();
	}

	/**
	 * 根据状态判断页面显示隐藏的方法
	 */
	private void showPage() {
		if(errorView!=null){
			errorView.setVisibility((curretState == STATE_ERROR)?View.VISIBLE:View.GONE);
		}
		
		if(emptyView!=null){
			emptyView.setVisibility((curretState == STATE_EMPTY)?View.VISIBLE:View.GONE);
		}
		
		//如果处于正在加载或者初始状态,都需要去让进度条转圈
		if(loadingView!=null){
			loadingView.setVisibility((curretState == STATE_LOADING 
					|| curretState == STATE_NONE)?View.VISIBLE:View.GONE);
		}
		
		//现在请求网络成功,state == STATE_SUCCESSED,显示成功的successedView
		if(curretState == STATE_SUCCESSED){
			if(successedView!=null){
				//为了防止多个成功界面叠加在一起,所以添加后一个成功界面前,将前一个成功界面移除
				removeView(successedView);
			}
			//1.请求网络的状态是成功,则匹配上成功状态码
			//2.创建成功的view,successedView因为在项目中的每一个模块都不一样,所以无法具体实现,只能抽象
			successedView = onCreateSuccessedView();
			//3.将加载成功的view加入帧布局
			addView(successedView);
		}
		
		if(successedView!=null){
			successedView.setVisibility((curretState == STATE_SUCCESSED)?View.VISIBLE:View.GONE);
		}
	}
	
	//根据网络请求的状态,决定哪个页面显示那个页面隐藏(成功,为空,失败,加载)
	//定义一个网络请求获取请求结果的方法
	public void show(){
		//1.将状态归位
		if(curretState == STATE_SUCCESSED || curretState == STATE_EMPTY || curretState ==  STATE_ERROR){
			//2.如果上一次请求的结果是(成功,或者失败,或者为空),发送下一次请求前都需要将状态归位
			curretState = STATE_NONE;
		}
		if(curretState == STATE_NONE){
			//3.开启一次新的请求
			new Thread(){
				public void run() {
					//4.在此处写具体的请求网络操作(url地址,请求方式,请求结果如何解析),请求网络的方法将其抽象
					ResultState resultState = onLoad();
					//5.将请求网络的结果,赋给记录当前请求网络状态的变量
					curretState = resultState.getState();
					
					//模板
//					runOnUiThread(new Runnable(){
//						run(){
//						}
//					});
					//参照上诉的模块编写了一个runInMainThread方法处理UI操作
					UIUtils.runInMainThread(new Runnable() {
						@Override
						public void run() {
							//6.根据curretState决定页面的显示
							showPage();
						}		
					});
				};
			}.start();
		}
	}
	//请求结果,在此类中需要获取出来(成功,失败,为空),枚举(不能创建对象类 构造方法私有)
	public abstract ResultState onLoad();
	//加载成功的view因为每一个界面都不一致,所以将其抽象,留给子类实现
	public abstract View onCreateSuccessedView() ;
	
	//定义一个枚举,限定请求结果的类型
	public enum ResultState{
		STATE_ERROR(1),
		STATE_EMPTY(2),
		STATE_SUCCESSED(4);
		
		private int state;
		private ResultState(int state){
			this.state = state;
		}
		
		public int getState(){
			return state;
		}
	}
	
	//等同于私有构造方法的类
/*	public class ResultState1{
		ResultState1 STATE_ERROR = new ResultState1(1);
		ResultState1 STATE_EMPTY = new ResultState1(2);
		ResultState1 STATE_SUCCESSED = new ResultState1(3);
		private int state;

		private ResultState1(int state){
			this.state = state;
		}
		
		public int getState(){
			return state;
		}
		public void test(){
			STATE_ERROR.getState();
		}
	}*/
}
